package arg

import (
	"database/sql"
	"fmt"
	"db2s/Er"
	"db2s/global"
	"strings"
)

/*
	------单机
	静态参数
	//innodb_flush_method：该参数定义InnoDB存储引擎刷新数据和日志文件到磁盘的方法。对于批量插入操作，可以将该参数设置为O_DIRECT，以直接将数据写入磁盘而不经过操作系统缓存。这可以提高性能，尤其是在高负载环境中。
	innodb_flush_method = o_direct_no_sync
	innodb_doublewrite = off
	//该参数定义了自增长（auto-increment）列的锁定模式。对于批量插入操作，可以将该参数设置为2（interleaved）或0（consecutive），以减少自增长锁的竞争，并提高性能。
	innodb_autoinc_lock_mode = 2
	//该参数用于控制InnoDB存储引擎对磁盘I/O操作的预期能力。对于批量插入操作，可以适当增加innodb_io_capacity的值，以提高磁盘I/O的吞吐量，从而加快数据写入速度。
	innodb_io_capacity = xxx
	//该参数定义InnoDB存储引擎的事务日志文件的大小。增大innodb_log_file_size的值可以提高日志写入性能，尤其是在批量插入操作时。
	innodb_log_file_size = 10G
	动态参数
	//设置网络传输包大小
	set global max_allowed_packet = 1G
	//设置插入操作缓冲区大小
	set global bulk_insert_buffer_size = 1G
	//设置innodb_lob_buffer
	set global innodb_log_buffer_size = 1G
	//修改事务提交落盘方式
	set global innodb_flush_log_at_trx_commit=0;
	//修改binlog提交落盘方式
	set global sync_binlog=0;
	//禁用插入缓冲
	set global innodb_change_buffering = none;
	//参数定义了刷新事务日志的时间间隔。它接受一个整数值，表示以秒为单位的时间间隔。当经过指定的时间间隔后，无论是否有新的事务提交，都会将事务日志刷新到磁盘。
	set global innodb_flush_log_at_timeout=30;
	该参数用于设置InnoDB存储引擎的缓冲池大小，即内存中用于缓存数据和索引的区域。增大innodb_buffer_pool_size的值可以提高读取性能，尤其是对于频繁访问的数据。
	set global innodb_buffer_pool_size = 物理内存的70%
	//设置mgr事务大小
	set global group_replication_transaction_size_limit = 0;

	-----集群
	关闭dtm、xa
	shard改为单节点

	---操作系统
	//调整tcp滑动窗口
	sysctl -w net.core.rmem_max=425984
	sysctl -w net.core.wmem_max=425984
	sysctl -p
*/

type TimeOut struct {
	Flow    int
	Segment int
	DDL     int
}
type syncLevel struct {
	Truncate          bool   `json:"truncate"`
	IgColumn          bool   `json:"igColumn"`
	FixRows           int    `json:"fixRows"`
	SqlMode           bool   `json:"sqlMode"`
	BreakPoint        bool   `json:"breakpoint"`
	RowsLimit         int    `json:"rowsLimit"`
	SqlLogBin         bool   `json:"logBin"`
	Scn               string `json:"scn"`
	Analyze           bool   `json:"analyze"`
	IgError           []int  `json:"igErr"`
	TimeOut           []int  `json:"timeOut"`
	Recover           bool   `json:"recover"`
	WriteParameterOpt bool   `json:"paramOpt"`
}

// syncRuleSecondaryLevelParameterCheck
func syncParameterCheck(s *SecondaryLevel) error {
	var (
		t   Er.InstanceEr
		err error
	)
	if t, err = Er.Instance(Er.InstanceStatus{
		DBType: s.DSnsV.SrcDBName,
	}); err != nil {
		return err
	}
	if strings.EqualFold(s.RulesV.Sync.Scn, "auto") {
		x, _ := t.Position(global.Position{Base: global.Instance{Db: map[string]*sql.DB{"single": s.DSnsV.CheckParameterSourceDB}}})
		s.RulesV.Sync.Scn = fmt.Sprintf("%v", x)
	}
	return nil
}
